import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import java.util.Calendar;
import java.util.Date;

public class HiloEntrada extends Thread {
	
	private JLabel fondo;
	
	@SuppressWarnings("unused")
	private int posX, posY;
	private Cliente cliente;
	private Cola cola;
	private Histograma histo;
	private EntradaClientes ec;
	private JTable jt_tabla_reportes;
	
	private int b;
	private JTable jt2_tabla_reportes;
	private JTable jt3_tabla_reportes;
	private JLabel fJ;
	
	

	private long velocidad_simulacion;

	public HiloEntrada(JLabel f, Histograma h, EntradaClientes ec, JTable jt_tabla_reportes, JTextField jtf_velocidad_simulacion,int b,JTable jt2_tabla_reportes,JTable jt3_tabla_reportes) {
		
		fondo = f;
		cliente = new Cliente();
		histo = h;
		cola = new Cola(fondo, histo);
		posX = 0;
		posY = 0;
		this.ec=ec;
		this.jt_tabla_reportes=jt_tabla_reportes;
			
		velocidad_simulacion = 100/Long.parseLong(jtf_velocidad_simulacion.getText());
		
		this.b=b;
		this.jt2_tabla_reportes = jt2_tabla_reportes;//caja
		this.jt3_tabla_reportes=jt3_tabla_reportes;//tomador
		fJ=new JLabel("cliente");
	
	}

	/*
	 * DISTRIBUCIONES EN EL SISTEMA
	 */
	/*---------------------------- 1 -------------------------------------*/
	public boolean repartirOficina() {
		boolean envio = false;
		int porcentaje = (int) (Math.random() * 100) + 1;
		if (porcentaje <= 70)
			envio = true;
		else
			envio = false;
		return envio;
	}

	/*---------------------------- 2 -------------------------------------*/
	public boolean repartirTomador() {
		boolean envio = false;
		int porcentaje = (int) (Math.random() * 100) + 1;
		if (porcentaje <= 55)
			envio = true;
		else
			envio = false;
		return envio;
	}

	/*---------------------------- 3 -------------------------------------*/
	// para las personas que se van a dirigir a estado de cuenta despues de ser
	// rechazados
	// por no tener estado del 40%, sacamos el 30% y de los 30% el 40%
	
	public boolean repartirAtencionCaja() {
		boolean envio = false;
		int porcentaje = (int) (Math.random() * 100) + 1;
		if (porcentaje <= 30)
			envio = true;
		else
			envio = false;
		return envio;
	}

/*
 * SIMULACION QUE VA A TOMADOR DE APUESTAS
 */
	public void movimEstadoSur() {
		/*int r=1;
		try{
		sleep(Transformada.expo(3));
		}catch (InterruptedException e){}
		jt_tabla_reportes.setValueAt(r,21,1);
		double m=(Math.random()*2);
		if(m==1){
			jt_tabla_reportes.setValueAt(r,22,1);

		}
		if(m==0){
			jt_tabla_reportes.setValueAt(r,23,1);

		}
		r++;*/
		cliente.CambiarImagS();
		for (int j = 296; j < 430; j++) {
			cliente.setLocation(130, j);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		movimEstadoEste();
	}
	
	public static String DaHora(){
		Calendar Hora = Calendar.getInstance();
		String g= (Hora.get(Calendar.HOUR_OF_DAY) +
				":" + Hora.get(Calendar.MINUTE) + ":"+ (Hora.get(Calendar.SECOND)));
		return g;
		
	}
	
	public void movimEstadoEste() {
		int posFinal = 0;
		int posLibre = 0;
		//int tabla_1=0, tabla_2=0,total_1=1,total_2=1;
		cliente.CambiarImagE();
		
		// coby_master incremento de clientes que entran a estado de cuenta		
		jt_tabla_reportes.setValueAt(ec.getClientes_entran_ec(),15,1);
		ec.incrementar_Cli_Entran_EC();
		
		for (int j = 130; j < 263; j++) {
			cliente.setLocation(j, 430);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		
		posFinal = cola.buscarVacio(0);
		if (posFinal == 0)
			System.out.println("");
			//movimTomadorSalida();
		else {
			for (int j = 263; j < posFinal; j++) {
				cliente.setLocation(j, 430);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);
				} catch (Exception e) {
				}
			}
			cliente.cambiarParado();
			try {
				int x=ec.getClientes_entran_ec();
				jt3_tabla_reportes.setValueAt(ec.getClientes_entran_ec(),x-1,0);
				
				Thread.sleep((1*1000)/b);//entrega de formulario
				jt3_tabla_reportes.setValueAt(DaHora(),x,1);
				Thread.sleep((DistribucionNormal.normal(2, 1)*1000)/b);//llenado del formulario
				jt3_tabla_reportes.setValueAt(DaHora(),x,2);
				Thread.sleep((DistribucionNormal.normal(3, 1))/b);//carga a la compu
				jt3_tabla_reportes.setValueAt(DaHora(),x,3);
				Thread.sleep((2*1000)/b);//pago de apuestas
				jt3_tabla_reportes.setValueAt(DaHora(),x,4);
				Thread.sleep((Transformada.expo(3))/b);//entre llamadas
				jt3_tabla_reportes.setValueAt(DaHora(),x,5);
				Thread.sleep((Transformada.expo(1))/b);//atencion de llamadas
				jt3_tabla_reportes.setValueAt(DaHora(),x,6);
				jt3_tabla_reportes.setValueAt(DaHora(),x,7);


			} catch (Exception e) {
			}

			if (cliente.getX() == 513) {
				histo.fijarEstadoPuesto(0, 0, false);
				luegoAtencionTomador();
			} else {
				while (cliente.getX() < 488) {
					posLibre = cola.marcarVacio(0, cliente.getX());
					histo.fijarEstadoPuesto(0, posLibre, false);
					moverPosicion(0);
					posFinal = cola.buscarVacio(0);

					try {
						Thread.sleep(5000);
					} catch (Exception e) {
					}
				}
				luegoAtencionTomador();
			}
		}
	}

/*
 * SIMULACION QUE VA A CAJA
 */
	public void movimCajaNorte() {
		cliente.CambiarImagN();
		for (int j = 210; j > 80; j--) {
			cliente.setLocation(130, j);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		movimCajaEste();
	}

	public void movimCajaEste() {
		int posFinal = 0;
		int posLibre = 0;
		//int tabla_1=0, tabla_2=0,total_1=1,total_2=1;
		cliente.CambiarImagE();
		
		// coby_master ==> incrementando el numero de clientes que entran a caja		
		jt_tabla_reportes.setValueAt(ec.getClientes_entran_caja(),8, 1);
		ec.incrementar_Cli_Entran_Caja();
		
		for (int j = 130; j < 263; j++) {
			cliente.setLocation(j, 80);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
	
		posFinal = cola.buscarVacio(1);
		if (posFinal == 0)
			System.out.println("");
			//movimCajaSalida();
		else {

			for (int j = 263; j < posFinal; j++) {
				cliente.setLocation(j, 80);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);
				} catch (Exception e) {
				}
			}
			cliente.cambiarParado();
			try {
				int y=ec.getClientes_entran_caja();
				jt2_tabla_reportes.setValueAt(ec.getClientes_entran_caja(),y-1,0);
				Thread.sleep((1*1000)/b);//recepcion 
				jt2_tabla_reportes.setValueAt(DaHora(),y,1);
				Thread.sleep((DistribucionNormal.normal(5, 1)*1000)/b);//verificacion de la apuesta
				jt2_tabla_reportes.setValueAt(DaHora(),y,2);

				Thread.sleep((2*1000)/b);//cobro de la apuesta
				jt2_tabla_reportes.setValueAt(DaHora(),y,3);
				jt2_tabla_reportes.setValueAt(DaHora(),y,4);


				
			} catch (Exception e) {
			}

			if (cliente.getX() == 513) {
				histo.fijarEstadoPuesto(1, 0, false);
				luegoAtencionCaja();
			} else {
				while (cliente.getX() < 488) {
					posLibre = cola.marcarVacio(1, cliente.getX());
					histo.fijarEstadoPuesto(1, posLibre, false);
					moverPosicion(1);
					posFinal = cola.buscarVacio(1);

					try {
						Thread.sleep(10000);
					} catch (Exception e) {
					}
				}
				luegoAtencionCaja();
			}
		}
	}

	public void moverPosicion(int col) {
		cliente.CambiarImagE();
		int posX = cliente.getX();
		if (col == 0) {
			for (int j = posX; j < posX + 25; j++) {
				cliente.setLocation(j, 430);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);
				} catch (Exception e) {
				}
			}
		} else {
			for (int j = posX; j < posX + 25; j++) {
				cliente.setLocation(j, 80);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);
				} catch (Exception e) {
				}
			}
		}
		cliente.cambiarParado();
	}
	
	public void movimTomadorSalida() {
		cliente.CambiarImagS();
		for (int j = 430; j < 490; j++) {
			cliente.setLocation(263, j);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 263; j < 650; j++) {
			cliente.setLocation(j, 490);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagN();
		for (int j = 490; j > 360; j--) {
			cliente.setLocation(650, j);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 650; j < 780; j++) {
			cliente.setLocation(j, 360);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		
		System.out.println ("El cliente esta saliendo de Tomador de Apuestas porque la cola esta muy llena");
		
		cliente.cambiarFalso();

	}

	public void movimCajaSalida() {
		cliente.CambiarImagN();
		for (int j = 80; j > 20; j--) {
			cliente.setLocation(263, j);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 263; j < 650; j++) {
			cliente.setLocation(j, 20);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagS();
		for (int j = 20; j < 150; j++) {
			cliente.setLocation(650, j);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 650; j < 780; j++) {
			cliente.setLocation(j, 150);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		
		System.out.println ("El cliente esta saliendo de Caja porque la cola esta muy llena");
		
		cliente.cambiarFalso();

	}
	public void caminaDerecho(int x, int y, int l){
		cliente.CambiarImagE();
		try{
			for(int i=x;i<l;i++){
		
			cliente.setLocation(i, y);
			fondo.add(cliente);
			Thread.sleep(5);
			fondo.repaint();
			}
		}
		catch (InterruptedException e){}
		
				
	}
	public void caminaAbajo(int x, int y, int l){
		cliente.CambiarImagS();
		try{
			for(int i=y;i<l;i++){
				cliente.setLocation(x,i);
				fondo.add(cliente);
				Thread.sleep(5);
				fondo.repaint();
			}
			
		}
		catch (InterruptedException e){}
	}
	public void caminaArriba(int x, int y,int l){
		cliente.CambiarImagN();
		try{
			for(int i=y;i>l;i--){
				cliente.setLocation(x,i);
				fondo.add(cliente);
				Thread.sleep(5);
				fondo.repaint();
			}
			
		}
		catch (InterruptedException e){}
		
	}
	public void luegoAtencionTomador() {
		boolean repartir = repartirTomador();
		@SuppressWarnings("unused")
		int posFinal = 0;
		if (repartir == true) {
			// coby_master ==> incrementando el numero de clientes que salen de estado de cuenta
			//jt_tabla_reportes.setValueAt(ec.getClientes_salen_ec(), 16, 1);
			//ec.incrementar_Cli_Salen_EC();
			caminaAbajo(513,430,500);
			caminaDerecho(513,500,700);
			caminaArriba(700,500,360);
			caminaDerecho(700,360,780);
			System.out.println ("El cliente esta saliendo de Tomador de Apuestas");
			cliente.cambiarFalso();

		} /*else {
			cliente.CambiarImagNO();
			for (int i = 513, j = 430; i > 130 && j > 80; i--, j--) {
				cliente.setLocation(i, j);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);
				} catch (Exception e) {
				}

			}
			
			System.out.println ("El cliente se dirije a Caja desde EstadoCuenta");
			
			movimCajaEste();

		}*/
	}

	public void luegoAtencionCaja() {
		boolean repartir = repartirAtencionCaja();
		@SuppressWarnings("unused")
		int posFinal = 0;
		if (repartir == true) {
			
			// coby_master ==> incrementando el numero de clientes que salen de caja
			//jt_tabla_reportes.setValueAt(ec.getClientes_salen_caja(), 9, 1);
			//ec.incrementar_Cli_Salen_Caja();
			
			 caminaArriba(513,80,10);
			 caminaDerecho(513,10,700);
			 caminaAbajo(700,10,150);
			 caminaDerecho(700,150,780);
			 
			
			System.out.println ("El cliente esta saliendo de Caja");
			
			cliente.cambiarFalso();

		}/* else {
			cliente.CambiarImagSO();
			for (int i = 513, j = 80; i > 130 && j < 430; i--, j++) {
				cliente.setLocation(i, j);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);
				} catch (Exception e) {
				}

			}
			
			System.out.println ("El cliente se dirije a EstadoCuenta desde Caja");
			
			movimEstadoEste();
		}*/
	}

	/*-----------------------------------------------------------------------------*/
	public void run() {
		
		cliente.CambiarImagE();
		for (int f = 10; f < 130; f++) {
			fJ.setBounds(f,250,150,25);
			cliente.setLocation(f, 250);
			fondo.add(fJ);
			fondo.add(cliente);
			try {
				Thread.sleep(velocidad_simulacion);
			} catch (Exception e) {
			}
		}
		
		boolean repartir = repartirOficina();
		if (repartir == true)
		{			
			System.out.println ("El cliente se va a Tomador de Apuestas");
			
			movimEstadoSur();
			
		} else {
			
			System.out.println ("El cliente se va a Caja");
			
			
			movimCajaNorte();
			
		}
	}
}